// ===============================================
// auth_controller
//
// Create by will on 2021/5/17 21:47
// Copyright @polynesia.All rights reserved.
// ===============================================

import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';

import '../api_entity/user/entity/login_info.dart';
import '../api_entity/user/entity/user_entity.dart';
import '../const/env_config.dart';
import '../core/core_kit.dart';
import '../preference/app_preferences.dart';
import '../preference/app_user_preferences.dart';

class AuthService extends GetxService {
  static AuthService get to => Get.find();
  // final Rx<LoginInfo> loginInfo = LoginInfo().obs;
  final Rx<UserEntity> appUser = const UserEntity().obs;

  /// Mocks a login process
  final RxBool isLoggedIn = false.obs;
  bool get isLoggedInValue => isLoggedIn.value;

  @override
  void onInit() {
    super.onInit();

    // //开启代理抓包
    // HttpProxyOverride httpProxyOverride =
    //     await HttpProxyOverride.createHttpProxy();
    // if (Env.appEnv != EnvName.release) {
    //   if (httpProxyOverride.host != null && httpProxyOverride.port != null) {
    //     HttpOverrides.global = httpProxyOverride;
    //   }
    // }

    //监听 appUser 的变化
    ever(appUser, handleAuthChanged);
  }

  Future<void> handleAuthChanged(UserEntity appUser) async {
    await configureCoreKit();
  }

  @override
  Future<void> onReady() async {
    super.onReady();
    await _loadLocalDate();
  }

  Future<void> _loadLocalDate() async {
    // 读取用户配置 方便写入内存 到时候 可以相应配读取用户信息
    final user = (await AppUserPreferences.getInstance()).user;

    if (user != null) {
      appUser.value = user;
      await updateUser(entity: user);
      isLoggedIn.value = true;
    } else {
      //第一次打开 没有有用户的时候要配置下 网络请求头
      await configureCoreKit();
      //没用户数据 跳转 登录页面
      // Get.rootDelegate.toNamed(AppRoutes.SignIn);
      isLoggedIn.value = false;
    }
  }

  Future<CoreKitConfig?>? configureCoreKit() async {
    // 初始化CoreKit
    CoreKit.config = CoreKitConfig(
      apiBaseUrlsGetter: Future.value(<String>[Env().envConfig.baseUrl!]),
      apiHeadersGenerator: () async {
        final headers = <String, dynamic>{};

        final info = (await AppUserPreferences.getInstance()).loginInfo;
        if (info != null) {
          headers['token'] = info.token?.accessToken;
        } else {
          //不存在的用清理
          onLogOut();
        }
        return headers;
      }(),
    );

    return CoreKit.config;
  }

  Future<void> updateUser(
      {UserEntity? entity,
      AppPreferences? appPreferences,
      bool? goMain}) async {
    // if (entity != null) {
    //   //更新用户信息 相对来说是 更新 _configureCoreKit
    //   appUser.value = entity;
    //   await configureCoreKit();
    //   //当前用户登陆成功 获取最新的用户信息
    //   getUserInfo(appPreferences, goMain);
    // } else {
    //   onLogOut();
    // }
  }

  Future<void> getUserInfo(
      {AppPreferences? appPreferences, bool? goMain}) async {
    // // 这里主要是 通过 用户token 获取用户信息 来保证 单点登录 减少后面请求的麻烦
    //
    // // final value = await UsersApi.acquire().getUserInfo().catchError((error) {
    // //   CoreKitToast.showError(error);
    // // });
    // // appUser.update((val) {
    // //   val!.user = value;
    // // });
    //
    // //通常 使用获取用户信息之后 存入数据库 让数据永远保存最新的一份
    // AppUserPreferences.getInstance().then((v) => v.setUser(appUser.value));
    //
    // appUser.refresh();
    //
    // if (goMain == null) Get.rootDelegate.toNamed(AppRoutes.AppMain);
  }

  Future<void> updateUserInfo([UserEntity? userInfo]) async {
    if (userInfo != null) {
      //更新用户信息 相对来说是 更新 _configureCoreKit
      appUser.value = userInfo;

      //通常 使用获取用户信息之后 存入数据库 让数据永远保存最新的一份
      await AppUserPreferences.getInstance()
          .then((appUserPreferences) => appUserPreferences.setUser(userInfo));
    }
  }

  void onLogOut() {
    // 清除用户信息
    debugPrint(' // 清除用户信息');
    AppUserPreferences.getInstance().then(
      (appUserPreferences) {
        appUserPreferences
          //删除登录的用户信息
          ..setUser(const UserEntity())
          //删除登录信息
          ..setLoginInfo(LoginInfo());
      },
    );

    //没用户数据 跳转 登录页面
    // Get.rootDelegate.offNamed(AppRoutes.SignIn);
    isLoggedIn.value = false;
  }
}
